package com.eudon.design_pattern.behavioral.visitor;

/**
 * @author eudon
 * @description PPT文件类 - 访问者模式中的具体元素
 * @date 2025/9/3
 * @email syd19970616@gmail.com
 * @address <a href="https://gitee.com/eudon">Gitee</a>
 */
public class PPTFile extends ResourceFile {
    /**
     * PPT文件的幻灯片数量
     */
    private int slideCount;
    
    /**
     * 是否包含动画效果
     */
    private boolean hasAnimations;
    
    /**
     * 演示时长（分钟）
     */
    private int durationMinutes;
    
    /**
     * 构造函数
     * @param fileName 文件名
     * @param fileSize 文件大小
     * @param slideCount 幻灯片数量
     * @param hasAnimations 是否包含动画
     * @param durationMinutes 演示时长
     */
    public PPTFile(String fileName, long fileSize, int slideCount, boolean hasAnimations, int durationMinutes) {
        super(fileName, fileSize);
        this.slideCount = slideCount;
        this.hasAnimations = hasAnimations;
        this.durationMinutes = durationMinutes;
    }
    
    /**
     * 接受访问者 - 实现双分派机制
     * 这里调用visitor.visit(this)，将当前PPT文件对象传递给访问者
     * 访问者会根据参数类型（PPTFile）选择对应的visit方法执行
     * 
     * @param visitor 访问者对象
     */
    @Override
    public void accept(Visitor visitor) {
        // 第二次分派：调用访问者的visit方法，传入当前PPT文件对象
        visitor.visit(this);
    }
    
    @Override
    public String getFileType() {
        return "PPT";
    }
    
    /**
     * 获取幻灯片数量
     * @return 幻灯片数量
     */
    public int getSlideCount() {
        return slideCount;
    }
    
    /**
     * 是否包含动画效果
     * @return true表示包含动画，false表示不包含
     */
    public boolean hasAnimations() {
        return hasAnimations;
    }
    
    /**
     * 获取演示时长
     * @return 演示时长（分钟）
     */
    public int getDurationMinutes() {
        return durationMinutes;
    }
    
    /**
     * 获取PPT文件的特殊属性信息
     * @return 属性信息字符串
     */
    public String getPptInfo() {
        return String.format("幻灯片: %d张, 动画效果: %s, 演示时长: %d分钟", 
                           slideCount, hasAnimations ? "有" : "无", durationMinutes);
    }
    
    @Override
    public String toString() {
        return super.toString() + " - " + getPptInfo();
    }
}